/*
 *                   江城子 . 程序员之歌
 *
 *               十年生死两茫茫，写程序，到天亮。
 *                   千行代码，Bug何处藏。
 *               纵使上线又怎样，朝令改，夕断肠。
 *
 *               领导每天新想法，天天改，日日忙。
 *                   相顾无言，惟有泪千行。
 *               每晚灯火阑珊处，夜难寐，加班狂。
 *
 *
 * @Descripttion: Vite 配置文件
 * @version: 1.0
 * @Date: 2021-04-20 11:06:21
 * @Author: jekingxu@163.com
 * @LastEditTime: 2022-09-24 14:33:17
 * @Author: jekingxu@163.com
 * @HomePage: https://xuxiaowen.space/vue3-element-admin
 * @Github: https://github.com/xuxiaowengjt
 * 
 */

// 导入Vite及相关插件
import { defineConfig } from 'vite'  // Vite配置函数，用于创建配置对象
import vue from '@vitejs/plugin-vue'  // Vue 3官方插件，提供Vue单文件组件支持
import path from 'path'  // Node.js路径处理模块
import { viteMockServe } from 'vite-plugin-mock'  // 提供数据模拟服务的插件
import viteSvgIcons from 'vite-plugin-svg-icons';  // SVG图标处理插件
import viteESLint from '@ehutch79/vite-eslint'  // ESLint代码检查插件
import { VitePWA } from 'vite-plugin-pwa';  // Progressive Web App支持插件

// https://vitejs.dev/config/
export default env => {
    // console.log(111, env);

    return defineConfig({
        // base: '/vue3-element-admin-site/',
        plugins: [
            vue(), // Vue.js 插件
            viteMockServe({
                ignore: /^_/, // 忽略以下划线`_`开头的文件
                mockPath: 'mock', // 指定mock目录中的文件全部是mock接口
                supportTs: false, // mockPath目录中的文件是否支持ts文件，现在我们不使用ts，所以设为false
                localEnabled: env.mode === 'mock', // 开发环境是否开启mock功能（可以在package.json的启动命令中指定mode为mock）
                prodEnabled: env.mode === 'mock', // 生产环境是否开启mock功能
                injectCode: `
          import { setupProdMockServer } from '../mock/_createProductionServer';
          setupProdMockServer();
        `,  // 在生产环境中注入的mock服务代码
            }),
            viteSvgIcons({  // SVG图标处理插件
                iconDirs: [path.resolve(__dirname, 'src/assets/svg')],  // 自动导入的SVG图标目录
                symbolId: 'icon-[dir]-[name]',  // SVG图标的命名格式，支持目录名和文件名作为标识
            }),
            viteESLint({
                include: ['src/**/*.vue', 'src/**/*.js'], // 指定需要进行 ESLint 检查的文件
            }),
            VitePWA({
                registerType: 'autoUpdate', // PWA 自动更新
                includeAssets: ['favicon.svg', 'favicon.ico', 'robots.txt', 'apple-touch-icon.png'], // 包含的静态资源
                manifest: {
                    name: 'Wic-poewer EMS', // 应用名称
                    short_name: 'EMS', // 应用短名称
                    description: 'JekingXu', // 应用描述
                    theme_color: '#ffffff', // 主题颜色
                    icons: [{  // PWA应用图标配置，用于添加到主屏幕
                        src: 'pwa-192x192.png',
                        sizes: '192x192',
                        type: 'image/png',
                    },
                    {
                        src: 'pwa-512x512.png',
                        sizes: '512x512',
                        type: 'image/png',
                    },
                    ],
                },
            }),
        ],
        css: {
            // CSS预处理器配置
            preprocessorOptions: {
                scss: {
                    // 全局变量
                    // additionalData: '@import "./src/assets/style/global-variables.scss";',
                    // element-plus升级到v2需要改成以下写法
                    additionalData: `@use "./src/assets/style/global-variables.scss" as *;`,  // 注入全局SCSS变量和混合器
                },
            },
        },
        // 路径别名配置
        resolve: {
            alias: {
                '@': path.resolve(__dirname, 'src'), // 路径别名，简化模块导入
            },
        },
        // 开发服务器配置
        server: {
            port: 3001, // 开发服务器web前端端口
            host: '0.0.0.0', // 允许访问局域网
            open: true, // 启动时自动打开浏览器
            hmr: { timeout: 120000 },  // 增加 HMR 超时时间
            // 代理配置
            proxy: {
                '/api': {
                    target: 'http://127.0.0.1', // 后端接口的域名
                    changeOrigin: true, // 是否改变源
                    rewrite: path => path.replace(/^\/api/, ''), // 重写路径，移除/api前缀
                },
            },
            // HTTP头配置
            headers: {
                // 'Content-Security-Policy': "script-src 'self' 'unsafe-inline' 'unsafe-eval' 'wasm-unsafe-eval' chrome-extension: blob: https:; object-src 'self' chrome-extension:; style-src 'self' 'unsafe-inline'; connect-src 'self' https: chrome-extension: ws:; img-src 'self' data: chrome-extension: https:; default-src 'self';",
                'X-Content-Type-Options': 'nosniff',
                'X-Frame-Options': 'SAMEORIGIN',
                'X-XSS-Protection': '1; mode=block',
                'Content-Security-Policy': "script-src 'self' 'unsafe-inline' 'unsafe-eval' 'wasm-unsafe-eval' chrome-extension: blob: https:; object-src 'self' chrome-extension:; style-src 'self' 'unsafe-inline'; connect-src 'self' https: chrome-extension: ws:; img-src 'self' data: chrome-extension: https:; font-src 'self' data:; default-src 'self';",
            },
            // HTTP头配置
         
        },
        // ESBuild配置
        esbuild: false,  // 禁用esbuild转换器
        // 构建配置
        build: {
            target: 'esnext', // 或者 'es2020'，指定构建目标的JavaScript版本
            // 代码压缩配置
            terserOptions: {
                compress: {
                    keep_infinity: true,  // 保留Infinity常量
                    // 删除console
                    drop_console: true,  // 移除控制台输出
                },
            },
            // 禁用该功能可能会提高大型项目的构建性能  打开会增加计算文件大小数据
            brotliSize: false,  // 禁用brotli压缩大小报告以提升构建性能
            // 确保不会因为包太大而警告
            chunkSizeWarningLimit: 2000,  // 设置chunk大小警告的限制  默认500kb
            // Rollup打包配置
            rollupOptions: {
                output: {
                    // 拆分单独模块
                    manualChunks: {  // 手动代码分割配置
                        'element-plus': ['element-plus'],  // 将element-plus库单独打包
                        mockjs: ['mockjs'],  // 将mockjs库单独打包
                        // naive: ['naive-ui'],
                        // date: ['date-fns']
                    },
                },
            },
        },
        // 依赖优化配置
        optimizeDeps: {
            exclude: ['@redis/client'], // 排除掉 Redis 客户端库，不进行依赖预构建
            timeout: 120000,  // 预构建超时时间（毫秒）
            // include: ['naive-ui', 'date-fns', '@vicons/ionicons5'],  // 预构建包含的依赖
        },
    })
}